/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.beansjsf.principal;

import br.com.saber.certificacao.beansjsf.interfacebean.BeanJSFInterface;
import br.com.saber.certificacao.modelos.Usuario;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 * Bean JSF exclusivo para mostrar usuários logados.
 * Seua única função é armazenar essa informação
 * Nenhum négócio é tratado no mesmo
 * AlunoInfo é utilizado para enviar informação para a tela
 * Login do aluno e hora de login
 * @author gbvbahia
 */
@ManagedBean(name = "alunosLogadosManager")
@ViewScoped
public class AlunosLogadosManager implements BeanJSFInterface {

    private static final Map<String, AlunoInfo> alunosLogadosMap = new LinkedHashMap<String, AlunoInfo>();

    private List<AlunoInfo> alunos;

    /** Creates a new instance of AlunosLogadosManager */
    public AlunosLogadosManager() {
    }

    //====================
    // Iniciadores
    //====================
    @Override
    @PreDestroy
    public void end() {
        Logger.getLogger(this.getClass().getName()).log(Level.FINEST, "AlunosLogadosManager.end() executado!");
    }

    @Override
    @PostConstruct
    public void init() {
        Logger.getLogger(this.getClass().getName()).log(Level.FINEST, "AlunosLogadosManager.init() executado!");
    }
    //====================
    //Métodos de Negócio
    //====================

    public void atualizaLista() {
        this.alunos = new ArrayList<AlunoInfo>();
        for (String alunoLogin : alunosLogadosMap.keySet()) {
            this.alunos.add(alunosLogadosMap.get(alunoLogin));
        }
    }

    public static void addUser(Usuario usuario) {
        String img = "";
        switch (usuario.getMaxRole().getPapel()) {
            case ADMINISTRADOR:
                img = "adm_24.png";
                break;
            case COORDENADOR:
                img = "coordenador_24.png";
                break;
            case PROFESSOR:
                img = "professor_24.png";
                break;
            case ALUNO:
                img = "aluno_24.png";
                break;
        }
        if (!alunosLogadosMap.containsKey(usuario.getLogin())) {
            alunosLogadosMap.put(usuario.getLogin(), new AlunosLogadosManager().new AlunoInfo(usuario.getLogin(), new Date(), img));
        } else {
            alunosLogadosMap.put(usuario.getLogin(), alunosLogadosMap.get(usuario.getLogin()).aumentaLog());
        }
    }

    public static void remnoveUser(Usuario usuario) {
        if (!alunosLogadosMap.containsKey(usuario.getLogin())) {
            return;
        }
        if (alunosLogadosMap.get(usuario.getLogin()).getLogs() > 1) {
            alunosLogadosMap.put(usuario.getLogin(), alunosLogadosMap.get(usuario.getLogin()).reduzLog());
        } else {
            alunosLogadosMap.remove(usuario.getLogin());
        }
    }
    //====================
    //Table Actions
    //====================
    //====================
    //SelectItem
    //====================
    //=========================
    //Getters AND Setters
    //=========================

    public List<AlunoInfo> getAlunos() {
        if (alunos == null) {
            atualizaLista();
        }
        return alunos;
    }

    public void setAlunos(List<AlunoInfo> alunos) {
        this.alunos = alunos;
    }

    public class AlunoInfo implements Serializable {

        private String aluno;

        private Date timeLogin;

        private String img;

        private int logs = 0;

        public AlunoInfo(String aluno, Date timeLogin, String img) {
            this.aluno = aluno;
            this.timeLogin = timeLogin;
            this.img = img;
            this.logs++;
        }

        public String getAluno() {
            return aluno;
        }

        public Date getTimeLogin() {
            return timeLogin;
        }

        public String getImg() {
            return img;
        }

        public int getLogs() {
            return logs;
        }

        public void setLogs(int logs) {
            this.logs = logs;
        }

        public AlunoInfo aumentaLog() {
            this.logs++;
            return this;
        }

        public AlunoInfo reduzLog() {
            this.logs--;
            return this;
        }
    }
}
